home *** CD-ROM | disk | FTP | other *** search
/ Power Tools for Macintosh / Power Tools for Macintosh (SoftBit)(1992).iso / Stacks / *F-I / HyperCard Utilities / Groupies 3.2 / stack_-1.xml < prev    next >
Encoding:
Extensible Markup Language  |  1988-12-20  |  12.0 KB  |  16 lines

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!DOCTYPE stack PUBLIC "-//Apple, Inc.//DTD stack V 2.0//EN" "" >
  3. <stack>
  4.     <name>in.2</name>
  5.     <id>-1</id>
  6.     <cardCount>7</cardCount>
  7.     <cardID>5256</cardID>
  8.     <listID>4741</listID>
  9.     <cantModify><false /></cantModify>
  10.     <cantDelete><false /></cantDelete>
  11.     <cantAbort><false /></cantAbort>
  12.     <cardSize>
  13.         <width>512</width>
  14.         <height>342</height>
  15.     </cardSize>
  16.     <script>---------------------------------------------------------------------
  17. -- Groupies 3.0, a utility for grouping objects, by Sioux Lacy
  18. -- This stack is public domain.  Happy grouping!
  19. --
  20. -- 04 May 1988  v2.1  revised for HyperCard version 1.2
  21. -- 07 May 1988  v2.2  added ability to copy the text in fields
  22. -- 01 June 1988 v2.3  revised to allow selection by dragging a rect
  23. -- 02 June 1988 v2.4  revised for use with functionKeys f5 thru f10
  24. -- 22 July 1988 v3.0  added equal space feature, revised presentation
  25. --
  26. -- Many thanks to Bill Atkinson for his help and encouragement
  27. ---------------------------------------------------------------------
  28.  
  29. -- You don't need to copy this first handler to your Home stack
  30. -- unless you have an extended keyboard (with function keys).
  31.  
  32. -- On an extended keyboard, this handler can be used to do Groupies
  33. -- messages by typing the function keys.  It uses keys F5 thru F11.
  34.  
  35. on functionKey whichKey
  36. global objectList
  37. if whichKey < 5 or whichKey > 11 then pass functionKey
  38. if whichKey is 5 then Group
  39. else if whichKey is 6 then Move
  40. else if whichKey is 7 then Copy
  41. else if whichKey is 8 then Paste
  42. else if whichKey is 9 then Erase
  43. else if whichKey is 10 then Align
  44. else if whichKey is 11 then Adjust
  45. end functionKey
  46.  
  47. ---------------------------------------------------------------------
  48. -- GROUPIES HANDLERS START HERE
  49. ---------------------------------------------------------------------
  50.  
  51. -- Message: Group
  52. -- This will let the user designate a number of objects to be grouped
  53. -- either by clicking on them, or showing a surrounding rectangle
  54.  
  55. on Group
  56. global objectList, whereTheGroupIs
  57. put "Objects" into selectMethod  -- default method
  58. if the optionKey is down then
  59. put Choice("Group objects by selecting:", "Objects", "Area") ¬¨
  60. into selectMethod
  61. end if
  62. if selectMethod is "Objects" then
  63. Confirm "Click buttons or fields, then press command."
  64. put empty into objectList
  65. put empty into whereTheGroupIs
  66. repeat until the commandKey is down
  67. set cursor to arrow
  68. if the mouseClick then
  69. set cursor to watch
  70. put HitTest(the clickLoc) into hitWhat
  71. if hitWhat is not empty and hitWhat is not in objectList
  72. then put hitWhat & "," after objectList
  73. else beep  -- invalid hit or nothing hit
  74. end if
  75. end repeat
  76. else   -- selectMethod is "Area"
  77. Confirm "Use 2 clicks to show opposite corners of area."
  78. put empty into objectList
  79. put empty into whereTheGroupIs
  80. set cursor to cross
  81. wait until the mouseClick
  82. put the clickLoc into selectRect
  83. DrawMarker selectRect
  84. wait until the mouseClick
  85. put "," & the clickLoc after selectRect
  86. DrawMarker the clickLoc
  87. set cursor to watch
  88. EraseMarkers
  89. WithinRect selectRect
  90. end if
  91. delete last char of objectList   -- get rid of trailing comma
  92. choose browse tool
  93. end Group
  94.  
  95. -- Message: Move
  96. -- This will reposition (on the current card) all the
  97. -- grouped objects.
  98. -- They will follow the mouse location.
  99.  
  100. on Move
  101. global objectList
  102. CheckGroup
  103. Confirm "Click and drag the group with mouse down."
  104. set cursor to arrow
  105. wait until the mouse is down
  106. put the mouseLoc into thisLoc
  107. repeat while the mouse is down
  108. put thisLoc into lastLoc
  109. put the mouseLoc into thisLoc
  110. if thisLoc is not lastLoc then
  111. put item 1 of thisLoc - item 1 of lastLoc into deltaX
  112. put item 2 of thisLoc - item 2 of lastLoc into deltaY
  113. lock screen
  114. repeat with i = 1 to the number of items in objectList
  115. put item i of objectList into object
  116. get location of object
  117. add deltaX to item 1 of it
  118. add deltaY to item 2 of it
  119. set location of object to it
  120. end repeat
  121. unlock screen
  122. end if
  123. end repeat
  124. end Move
  125.  
  126. -- Message: Copy
  127. -- This will remember, in a global variable, the current card.  Then,
  128. -- when the user 'pastes', the objects will be copied from that card.
  129.  
  130. on Copy
  131. global whereTheGroupIs, savedUserLevel
  132. CheckGroup
  133. put the userLevel into savedUserLevel
  134. set the userLevel to 5   -- will be restored after 'Paste'
  135. Confirm "Go wherever you wish and 'Paste'."
  136. put the long id of this card into WhereTheGroupIs
  137. end Copy
  138.  
  139. -- Message: Paste
  140. -- This will paste all the objects in the group into the current card /
  141. -- background. It must be preceded by 'Copy'.
  142.  
  143. on Paste
  144. global objectList, WhereTheGroupIs, savedUserLevel
  145. CheckGroup
  146. if WhereTheGroupIs is empty
  147. then Abort "Please choose 'Copy' before 'Paste'."
  148. set cursor to watch
  149. set lockMessages to true
  150. lock screen
  151. repeat with i = 1 to the number of items in objectList
  152. push this card
  153. go to WhereTheGroupIs
  154. put item i of objectList into object
  155. if word 2 of object is "field"
  156. then put the value of object into copyOfText
  157. select object
  158. type "C" with commandKey
  159. pop card
  160. set editBkgnd to (word 1 of object = "bkgnd")
  161. type "V" with commandKey
  162. if word 2 of object is "field" then
  163. if word 1 of object is "bkgnd"
  164. then put copyOfText into bkgnd field (the number of bkgnd fields)
  165. else put copyOfText into card field (the number of card fields)
  166. end if
  167. end repeat
  168. choose browse tool
  169. unlock screen
  170. set the userLevel to savedUserLevel
  171. Prompt "These new objects are not grouped. The old group is still valid."
  172. end Paste
  173.  
  174. -- Message: Erase
  175. -- This will delete all the objects in the group. They are removed
  176. -- from the stack, and the operation is not undoable.
  177.  
  178. on Erase
  179. global objectList, WhereTheGroupIs
  180. CheckGroup
  181. Confirm "Deleting group is not undoable. Are you sure?"
  182. repeat with i = the number of items in objectList down to 1
  183. select item i of objectList
  184. type "X" with commandKey
  185. end repeat
  186. put empty into objectList
  187. put empty into WhereTheGroupIs
  188. choose browse tool
  189. end Erase
  190.  
  191. -- Message: Align
  192. -- This will line up the objects flush left, right, top or bottom,
  193. -- depending on the user's wishes.
  194.  
  195. on Align
  196. global objectList
  197. CheckGroup
  198. put Choice("Adjust members by moving them:","Left/Right","Up/Down") ¬¨
  199. into axis
  200. if axis is "Up/Down"
  201. then answer "Align objects at:" with "Top" or "Bottom" or "Center"
  202. else answer "Align objects at:" with "Left" or "Right" or "Center"
  203. put it into alignment
  204. Confirm "Click where you wish them to align."
  205. set cursor to cross
  206. wait until the mouseClick
  207. if alignment is "Center" then
  208. repeat with i = 1 to the number of items in objectList
  209. put item i of objectList into object
  210. get location of object
  211. if axis is "Up/Down"
  212. then put the clickV into item 2 of it
  213. else put the clickH into item 1 of it
  214. set location of object to it
  215. end repeat
  216. else
  217. repeat with i = 1 to the number of items in objectList
  218. put item i of objectList into object
  219. if axis is "Up/Down" then
  220. if alignment is "Top"
  221. then set top of object to the clickV
  222. else set bottom of object to the clickV
  223. else if axis is "Left/Right" then
  224. if alignment is "Left"
  225. then set left of object to the clickH
  226. else set right of object to the clickH
  227. end if
  228. end repeat
  229. end if
  230. end Align
  231.  
  232. -- Message: Adjust
  233. -- This will put an equal amount of 'white' space between consecutive
  234. -- objects in the group. Note that the objects must be in ascending
  235. -- order for this to work as expected.
  236.  
  237. on Adjust
  238. global objectList
  239. CheckGroup
  240. put Choice("Adjust space between objects:","Horizontally","Vertically") ¬¨
  241. into adjust
  242. Confirm "Use 2 clicks to show desired spacing."
  243. set cursor to cross
  244. wait until the mouseClick
  245. put the clickLoc into startLoc
  246. DrawMarker startLoc
  247. wait until the mouseClick
  248. put the clickLoc into endLoc
  249. DrawMarker endLoc
  250. SortGroup adjust
  251. if adjust = "Horizontally" then
  252. put abs(item 1 of endLoc - item 1 of startLoc) into horizSpace
  253. put right of item 1 of objectList into lastRight
  254. repeat with i = 2 to the number of items in objectList
  255. put item i of objectList into object
  256. set left of object to lastRight + horizSpace
  257. put right of object into lastRight
  258. end repeat
  259. else  -- adjust "Vertically"
  260. put abs(item 2 of endLoc - item 2 of startLoc) into vertSpace
  261. put bottom of item 1 of objectList into lastBottom
  262. repeat with i = 2 to the number of items in objectList
  263. put item i of objectList into object
  264. set top of object to lastBottom + vertSpace
  265. put bottom of object into lastBottom
  266. end repeat
  267. end if
  268. EraseMarkers
  269. end Adjust
  270.  
  271. -------------------------------------------------------------
  272.  
  273. on Abort what
  274. answer what
  275. exit to HyperCard
  276. end Abort
  277.  
  278. on CheckGroup
  279. global objectList
  280. if objectList is empty then Abort "There are no objects in the group."
  281. end CheckGroup
  282.  
  283. function Choice prompt, choice1, choice2
  284. answer prompt with choice1 or choice2 or "Cancel"
  285. if it is "Cancel" then exit to HyperCard
  286. return it
  287. end Choice
  288.  
  289. on Confirm what
  290. answer what with "Cancel" or "OK"
  291. if it is "Cancel" then exit to HyperCard
  292. end Confirm
  293.  
  294. on DrawMarker where
  295. lock screen
  296. doMenu "New Button"
  297. put the number of card btns into newBtn
  298. set icon of card btn newBtn to "Marker Cross"
  299. set style of card btn newBtn to transparent
  300. set showName of card btn newBtn to false
  301. set rect of card btn newBtn to 0,0,20,20
  302. set loc of card btn newBtn to where
  303. set name of card btn newBtn to empty
  304. choose browse tool
  305. unlock screen
  306. end DrawMarker
  307.  
  308. on EraseMarkers
  309. lock screen
  310. select card btn (the number of card btns)
  311. doMenu "Clear Button"
  312. select card btn (the number of card btns)
  313. doMenu "Clear Button"
  314. choose browse tool
  315. unlock screen
  316. end EraseMarkers
  317.  
  318. function HitTest where
  319. repeat with i = the number of card buttons down to 1
  320. if where is within rect of card button i then
  321. if visible of card button i
  322. then return "card button id " & the id of card button i
  323. end if
  324. end repeat
  325. repeat with i = the number of card fields down to 1
  326. if where is within rect of card field i then
  327. if visible of card field i
  328. then return "card field id " & the id of card field i
  329. end if
  330. end repeat
  331. repeat with i = the number of bkgnd buttons down to 1
  332. if where is within rect of bkgnd button i then
  333. if visible of bkgnd button i
  334. then return "bkgnd button id " & the id of bkgnd button i
  335. end if
  336. end repeat
  337. repeat with i = the number of bkgnd fields down to 1
  338. if where is within rect of bkgnd field i then
  339. if visible of bkgnd field i
  340. then return "bkgnd field id " & the id of bkgnd field i
  341. end if
  342. end repeat
  343. return empty
  344. end HitTest
  345.  
  346. on Prompt what
  347. put what
  348. put the seconds into startTime
  349. put the mouseLoc into startLoc
  350. wait until (the seconds = startTime+10) or (the mouseLoc <>¬¨ startLoc)
  351. put empty into message box
  352. hide message box
  353. end Prompt
  354.  
  355. on SortGroup how
  356. global objectList
  357. put empty into sortedList
  358. if how is "Vertically" then put true into verticalSort
  359. else put false into verticalSort
  360. repeat with i = 1 to the number of items in objectList
  361. put false into inserted
  362. if verticalSort then get top of item i of objectList
  363. else get left of item i of objectList
  364. repeat with j = 1 to the number of items in sortedList
  365. if (verticalSort and (it < top of item j of sortedList)) or ¬¨
  366. (not verticalSort and (it < left of item j of sortedList)) then
  367. put item i of objectList & "," before item j of sortedList
  368. put true into inserted
  369. exit repeat
  370. end if
  371. end repeat
  372. if inserted is false then put item i of objectList & "," after ¬¨
  373. sortedList
  374. end repeat
  375. delete last char of sortedList
  376. put sortedList into objectList
  377. end SortGroup
  378.  
  379. on WithinRect selectRect
  380. global objectList
  381. repeat with i = the number of card buttons down to 1
  382. if the loc of card button i is within selectRect then
  383. if visible of card button i
  384. then put "card button id " & the id of card button i ¬¨
  385. & "," after objectList
  386. end if
  387. end repeat
  388. repeat with i = the number of card fields down to 1
  389. if the loc of card field i is within selectRect then
  390. if visible of card field i
  391. then put "card field id " & the id of card field i ¬¨
  392. & "," after objectList
  393. end if
  394. end repeat
  395. repeat with i = the number of bkgnd buttons down to 1
  396. if the loc of bkgnd button i is within selectRect then
  397. if visible of bkgnd button i
  398. then put "bkgnd button id " & the id of bkgnd button i ¬¨
  399. & "," after objectList
  400. end if
  401. end repeat
  402. repeat with i = the number of bkgnd fields down to 1
  403. if the loc of bkgnd field i is within selectRect then
  404. if visible of bkgnd field i
  405. then put "bkgnd field id " & the id of bkgnd field i ¬¨
  406. & "," after objectList
  407. end if
  408. end repeat
  409. end WithinRect
  410.  
  411. -----------------------------